#include <iostream>
#include <time.h>
#ifndef PLAYING_CARD_H_INCLUDED
#define PLAYING_CARD_H_INCLUDED

using namespace std;

enum sort_order {ascending, descending};

enum suit { spade=3, heart=2, diamond=1, club=0 };

enum suit_char { spade_c = 6, heart_c = 3, diamond_c = 4, club_c = 5 };

enum ranK {ace, two, three, four, five, six, seven, eight, nine, ten, jack, queen, king};

struct playing_card
{
    suit _suit;
    suit_char suit_c;
    ranK _rank;
};

string getSuit(suit s)
{
    string card_suit;
    switch (s)
    {
        case spade :
            card_suit = "spade";
            break;
        case heart :
            card_suit = "heart";
            break;
        case diamond :
            card_suit = "diamond";
            break;
        case club :
            card_suit = "club";
            break;
    }
    return card_suit;
}

string getRank(ranK r)
{
    string card_rank;
    switch (r)
    {
        case ace : card_rank = "A"; break;
        case two : card_rank = "2"; break;
        case three : card_rank = "3"; break;
        case four : card_rank = "4"; break;
        case five : card_rank = "5"; break;
        case six : card_rank = "6"; break;
        case seven : card_rank = "7"; break;
        case eight : card_rank = "8"; break;
        case nine : card_rank = "9"; break;
        case ten : card_rank = "10"; break;
        case jack : card_rank = "J"; break;
        case queen : card_rank = "Q"; break;
        case king : card_rank = "K"; break;
    }
    return card_rank;
}

//задаване на символ за цвета, според цвета
void setSuitChar(playing_card &card)
{
    if(card._suit == spade)
        card.suit_c = spade_c;
    if(card._suit == diamond)
        card.suit_c = diamond_c;
    if(card._suit == heart)
        card.suit_c = heart_c;
    if(card._suit == club)
        card.suit_c = club_c;
}

void print_playing_card(playing_card card)
{
    cout << "rank: " << getRank(card._rank) << endl;
    cout << "suit: " << getSuit(card._suit) << endl;
    cout << "suit_char: " << (char)card.suit_c << endl;
}

void print_playing_card_short(playing_card card)
{
    cout << getRank(card._rank) << (char)card.suit_c;
}

void show_all_cards(playing_card cards[], int SIZE)
{
    for(int i = 0; i < SIZE; i++)
    {
        print_playing_card_short(cards[i]);
        cout << "  ";
    }
    cout << endl;
}

//създаване на произволна карта
playing_card createCard_random()
{
    playing_card new_card;
    //cast-ване на int към обект rank
    new_card._rank = (ranK)(rand() % 13);
    //cast-ване на int към обект suit
    new_card._suit = (suit)(rand() % 4);
    setSuitChar(new_card);
    return new_card;
}

//създаване на произволна карта
playing_card createCard(int r, int s)
{
    playing_card new_card;
    new_card._rank = (ranK)(r);
    new_card._suit = (suit)(s);
    setSuitChar(new_card);
    return new_card;
}

void swap_cards(playing_card &card1, playing_card &card2)
{
    playing_card temp_card = card1;
    card1 = card2;
    card2 = temp_card;
}

//сортиране на група карти във възходящ ред, първи критерий - ранк, втори критерий - цвят
void sort_cards_rankFirst_asc(playing_card cards[], int SIZE)
{
    for(int i = 0; i < SIZE-1; i++)
    {
        int extreme = i;
        for(int j = i+1; j < SIZE; j++)
        {
            if(cards[j]._rank < cards[extreme]._rank)
            {
                extreme = j;
            }
            if(cards[j]._rank == cards[extreme]._rank && cards[j]._suit < cards[extreme]._suit)
            {
                extreme = j;
            }
        }
        swap_cards(cards[i], cards[extreme]);
    }
}

//сортиране на група карти в низходящ ред, първи критерий - ранк, втори критерий - цвят
void sort_cards_rankFirst_desc(playing_card cards[], int SIZE)
{
    for(int i = 0; i < SIZE-1; i++)
    {
        int extreme = i;
        for(int j = i+1; j < SIZE; j++)
        {
            if(cards[j]._rank > cards[extreme]._rank)
            {
                extreme = j;
            }
            if(cards[j]._rank == cards[extreme]._rank && cards[j]._suit > cards[extreme]._suit)
            {
                extreme = j;
            }
        }
        swap_cards(cards[i], cards[extreme]);
    }
}

//сортиране на група карти с указване на реда: възходящ или низходящ, първи критерий - ранк, втори критерий - цвят
void sort_cards_rankFirst(playing_card cards[], int SIZE, sort_order order)
{
    for(int i = 0; i < SIZE-1; i++)
    {
        int extreme = i;
        for(int j = i+1; j < SIZE; j++)
        {
            if((cards[j]._rank < cards[extreme]._rank && order == ascending)
               || (cards[j]._rank > cards[extreme]._rank && order == descending))
            {
                extreme = j;
            }
            if((cards[j]._rank == cards[extreme]._rank && cards[j]._suit < cards[extreme]._suit && order == ascending)
               || (cards[j]._rank == cards[extreme]._rank && cards[j]._suit > cards[extreme]._suit && order == descending))
            {
                extreme = j;
            }
        }
        swap_cards(cards[i], cards[extreme]);
    }
}

//сортиране на група карти с указване на реда: възходящ или низходящ; първи критерий - ЦВЯТ, втори критерий - РАНК
void sort_cards_suitFirst(playing_card cards[], int SIZE, sort_order order)
{
    for(int i = 0; i < SIZE-1; i++)
    {
        int extreme = i;
        for(int j = i+1; j < SIZE; j++)
        {
            if((cards[j]._suit < cards[extreme]._suit && order == ascending)
               || (cards[j]._suit > cards[extreme]._suit && order == descending))
            {
                extreme = j;
            }
            if((cards[j]._suit == cards[extreme]._suit && cards[j]._rank < cards[extreme]._rank && order == ascending)
               || (cards[j]._suit == cards[extreme]._suit && cards[j]._rank > cards[extreme]._rank && order == descending))
            {
                extreme = j;
            }
        }
        swap_cards(cards[i], cards[extreme]);
    }
}

#endif // PLAYING_CARD_H_INCLUDED
